package com.swm.yzgrtk.utils;

/**
 * @author 师文明
 * @data 2025/3/4 上午9:21
 **/

public class CRC24util {

    // 定义 CRC24 的多项式
    private static final int CRC24_POLY = 0x1864CFB;

    /**
     * 计算 RTCM CRC24 校验和
     *
     * @param data 待校验的数据
     * @return 计算得到的 CRC24 校验和
     */
    public static int rtcmCrc24(byte[] data) {
        int crc = 0;
        for (byte b : data) {
            crc ^= (b & 0xFF) << 16;
            for (int j = 0; j < 8; j++) {
                if ((crc & 0x800000) != 0) {
                    crc = (crc << 1) ^ CRC24_POLY;
                } else {
                    crc <<= 1;
                }
            }
        }
        return crc & 0xFFFFFF;
    }

    public static void main(String[] args) {
        String data = "d300504320092b2bb262002089c0803000000000200000007f474d4348484e42c4f274b00a4d3adfe85728efa00d6683fad66294155a095ba83edd802da4066b8bf5397f83d7a0bc72fffffff80b2ac2cb27c4";
        byte[] bytes = hexStringToByteArray(data);
        int crc = rtcmCrc24(bytes);
        System.out.printf("CRC24: 0x%06X\n", crc);
    }

    public static byte[] hexStringToByteArray(String hex) {
        // 检查输入字符串长度是否为偶数
        if (hex.length() % 2 != 0) {
            return null;
        }
        // 创建一个字节数组，长度为十六进制字符串长度的一半
        byte[] bytes = new byte[hex.length() / 2];
        for (int i = 0; i < hex.length(); i += 2) {
            // 将每两个十六进制字符转换为一个字节
            bytes[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                    + Character.digit(hex.charAt(i + 1), 16));
        }
        return bytes;
    }


}
